#include <stdbool.h>
#include <struct/nv.h>
#include <mem/free.h>

#define GO_CHILD			0
#define GO_PARENT			1
#define GO_PREVIOUS			2
#define GO_NEXT				3

static nv_t * nv_free_one(nv_t * this) {												// 返回this->next
	nv_t * next = this->next;

	safe_free(this->name);																// free名字，所以名字一定不能使用常量，要使用malloc分配的量。
	safe_free(this->value);																// free值，所以值一定不能使用常量，要使用malloc分配的量。
	safe_free(this);																	// 释放本结构体

	return next;
}

void nv_free(nv_t * root) {																// 释放节点所占用内存
	bool end;
	nv_t * pt = root;
	nv_t * parent;

	if (!root) return;																	// 要删除的不是

	while (true) {
		while (pt->child) pt = pt->child;												// 一层一层打开容器。 执行完后，pt可能是空容器，也可能是数据。
		parent = pt->parent;															// 保存信息，因为pt马上要被free掉
		pt	   = nv_free_one(pt);														// 释放 name/value/本结构体，返回pt->next
		if (pt) continue;																// 如果next存在，删除next

		while(true) {
			pt 	   = parent;															// parent一定会有的。
			end	   = pt == root;
			parent = pt->parent;														// 保存信息，因为pt马上要被free掉
			pt     = nv_free_one(pt);													// 释放 name/value/本结构体，返回pt->next
			if (end) return;															// 释放掉root之后，任务结束
			if (pt) break;																// 去删除下一个节点
		}
	}
}
